/**
在 TypeScript 中，setter 和 getter 是用于访问和修改类属性的特殊方法。它们提供了一种封装机制，使得可以在访问属性时添加逻辑，从而控制对属性的读取和写入。
  1. 定义 Getter 和 Setter
  - Getter：用于获取属性值的方法。使用  `get`  关键字定义，允许通过属性的方式访问。
  - Setter：用于设置属性值的方法。使用  `set`  关键字定义，允许通过属性的方式赋值。
   示例：
  class Person {
      private _name: string;

      constructor(name: string) {
          this._name = name;
      }

      // Getter
      get name(): string {
          return this._name;
      }

      // Setter
      set name(newName: string) {
          if (newName.length > 0) {
              this._name = newName;
          } else {
              console.log("名字不能为空");
          }
      }
  }

  const person = new Person("Alice");
  console.log(person.name); // 输出: Alice

  person.name = "Bob";      // 调用 Setter
  console.log(person.name); // 输出: Bob

  person.name = "";         // 输出: 名字不能为空
  2. 使用场景
  - 数据验证：通过 setter 可以在设置属性值时进行验证，确保属性值符合特定条件。
  - 计算属性：通过 getter 可以计算并返回一个值，而不是直接返回存储的值。
  - 封装：将属性设为私有（private），通过 getter 和 setter 提供对属性的访问，增强封装性。

  3. 注意事项
  - 命名约定：通常，getter 和 setter 的命名遵循属性名的命名规则，getter 使用  `get`  前缀，setter 使用  `set`  前缀。
  - 性能：使用 getter 和 setter 可能会引入额外的开销，特别是在频繁访问属性的情况下。需要权衡使用场景。

  4. 结论
  在 TypeScript 中，setter 和 getter 提供了一种优雅的方式来控制对类属性的访问。通过使用 getter 和 setter，可以实现更好的数据封装和属性验证，增强代码的可维护性和可读性。在实际开发中，合理使用 getter 和 setter 可以提升类的设计质量。
 */
class Person {
  // 私有属性: 属性前面会使用_
  private _name: string
  private _age: number

  constructor(name: string, age: number) {
    this._name = name
    this._age = age
  }

  running() {
    console.log(this._name + ' running')
  }

  // setter/getter: 对属性的访问进行拦截操作
  set name(name: string) {
    this._name = name
  }

  get name() {
    return this._name
  }

  set age(newValue: number) {
    if (newValue >= 0 && newValue <= 200) {
      this._age = newValue
    }
  }

  get age() {
    return this._age
  }
}

const p = new Person('setter-getter-name', 18)
p.name = 'new-name'
p.age = 20
p.running()
console.log(p.name, p.age)

export {}
